package com.icbc.DataStructuresAndAlgorithms;

import java.util.Scanner;

/**
 * 队列
 */
public class QueueDomo {
	public static void main(String[] args) {
		Queue queue = new Queue(3);
		Scanner sc = new Scanner(System.in);
		System.out.println("e:退出");
		System.out.println("a:添加");
		System.out.println("g:获取");
		System.out.println("f:遍历");
		System.out.println("r:重置");
		while (true){
			
			char a = sc.next().toCharArray()[0];
			switch (a){
				case 'a' :
					System.out.println("请输入要添加的内容!");
					queue.add(sc.next());
					break;
				case 'g' :
					System.out.println(queue.get());
					break;
				case 'f' :
					queue.forQueue();
					break;
				case 'r' :
					queue.resive();
					break;
			}
			if (a == 'e')break;
			System.out.println("操作成功!");
		}
		System.out.println("退出操作!");
	}
}

//队列类
class Queue{
	private int maxSize;//表示数组的最大值
	private int front;//表示队列头
	private int rear;//表示队列尾
	private Object[] arr;//任务队列
	
	//提供一个公共的有参构造器,需要传入此队列的大小
	public Queue(int maxSize){
		this.maxSize = maxSize;
		this.arr = new Object[maxSize];
		this.front = 0;//注意:front为0那么在遍历时需要将front,也就是front包含队列列头数据
		this.rear = 0;//注意:rear在添加数据时会进行++,所以rear-1指向的是有数据的最后一位,不包含列尾数据
	}
	
	//提供一个添加方法
	public void add(Object o) {
		//判断队列是否已满
		if (rear != front && (rear % maxSize == front % maxSize)){
			System.out.println("队列已满!");
			return;
		}
		arr[rear++ % maxSize] = o;
	}
	
	//提供一个获取方法
	public Object get(){
		//判断队列是否为空
		if (rear == front){
			return null;
		}
		return arr[front++ % maxSize];
	}
	
	//遍历队列
	public void forQueue(){
		for (int a = front ; a < rear ; a++){
			System.out.println(arr[a % maxSize]);
		}
	}
	
	//重置队列
	public void resive(){
		front = 0;
		rear = 0;
	}
}
